// Dart中的接口定义和关键字解释:

// 1. abstract class (抽象类)
// - 使用abstract关键字声明抽象类
// - 抽象类可以包含抽象方法(没有方法体)和具体方法
// - 抽象类不能被实例化,只能被继承或实现

// 2. implements (实现)
// - 使用implements关键字实现一个或多个接口
// - 实现接口的类必须重写接口中定义的所有方法和属性
// - 一个类可以实现多个接口,用逗号分隔

// 3. @override (重写)
// - 表示重写父类或接口中的方法
// - 确保方法签名与父类或接口中的一致
// - 是一个可选的注解,但推荐使用以提高代码可读性

// 4. late (延迟初始化)
// - 声明一个非空变量,但不立即初始化
// - 在首次使用前必须赋值
// - 如果在赋值前访问会抛出异常

// 5. required (必需参数)
// - 用在命名参数前,表示该参数是必须的
// - 确保在创建对象时必须提供这些参数
// - 提高代码的安全性和可读性

// 定义一个动物接口
abstract class Animal {
  // 动物的名字
  late String name;
  // 动物的年龄
  late int age;

  void eat();
  void sleep();
}

// 定义一个会飞的接口
abstract class Flyable {
  // 飞行高度
  late double flyHeight;
  // 飞行速度
  late double flySpeed;

  void fly();
}

// 实现鸟类
class Bird implements Animal, Flyable {
  @override
  String name;
  @override
  int age;
  @override
  double flyHeight;
  @override
  double flySpeed;

  // 构造函数
  Bird({
    required this.name,
    required this.age,
    this.flyHeight = 100.0,
    this.flySpeed = 50.0,
  });

  @override
  void eat() {
    print('$name在吃虫子');
  }

  @override
  void sleep() {
    print('$name在树上睡觉');
  }

  @override
  void fly() {
    print('$name在${flyHeight}米的高空以${flySpeed}km/h的速度飞翔');
  }
}

// 实现猫类
class Cat implements Animal {
  @override
  String name;
  @override
  int age;

  // 构造函数
  Cat({required this.name, required this.age});

  @override
  void eat() {
    print('$name在吃鱼');
  }

  @override
  void sleep() {
    print('$name在沙发上睡觉');
  }
}

void main() {
  Bird bird = Bird(name: '小鸟', age: 2);
  bird.eat();
  bird.sleep();
  bird.fly();

  Cat cat = Cat(name: '咪咪', age: 3);
  cat.eat();
  cat.sleep();
}
